package com.zb.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zb.entity.SelectGoodsVo;
import com.zb.entity.SelectVo;
import com.zb.entity.ZjGoodsSpec;
import com.zb.entity.ZjGoodsSpecContent;
import com.zb.mapper.ZjGoodsSpecMapper;
import com.zb.result.PageUtil;
import com.zb.service.ZjGoodsSpecContentService;
import com.zb.service.ZjGoodsSpecService;
import com.zb.vo.GoodsSpecContentVo;
import com.zb.vo.GoodsSpecListVo;
import com.zb.vo.GoodsSpecSelectVo;
import com.zb.vo.GoodsSpecVo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 产品规格表 服务实现类
 * </p>
 *
 * @author WEN
 * @since 2023-08-01
 */
@Service
public class ZjGoodsSpecServiceImpl extends ServiceImpl<ZjGoodsSpecMapper, ZjGoodsSpec> implements ZjGoodsSpecService {
    @Resource
    private ZjGoodsSpecMapper goodsSpecMapper;
    @Resource
    private ZjGoodsSpecContentService goodsSpecContentService;

    // 新增或修改规格
    @Override
    @Transactional
    public void save(Long custAccId, GoodsSpecVo goodsSpecVo) {
        Assert.isTrue(null == goodsSpecMapper.existByName(custAccId, goodsSpecVo.getId(), goodsSpecVo.getName()), "规格名称已重复！", goodsSpecVo.getName());
        ZjGoodsSpec spec = new ZjGoodsSpec();
        BeanUtils.copyProperties(goodsSpecVo, spec);
        spec.setDisabled(goodsSpecVo.getStatus());
        if (null != spec.getId()) {
            this.updateById(spec);
            if (null != goodsSpecVo.getContentIdList() && !goodsSpecVo.getContentIdList().isEmpty()) {
                goodsSpecContentService.removeByIds(goodsSpecVo.getContentIdList());
            }
            goodsSpecContentService.save(custAccId, spec.getId(), goodsSpecVo.getContentList());
            return;
        }
        spec.setId(IdWorker.getId());
        spec.setCustAccId(custAccId);
        this.save(spec);
        goodsSpecContentService.save(custAccId, spec.getId(), goodsSpecVo.getContentList());
    }

    // 获取规格列表
    @Override
    public Map<String, Object> getList(Long custAccId, GoodsSpecSelectVo selectVo) {
        QueryWrapper<ZjGoodsSpec> wrapper = new QueryWrapper<>();
        wrapper.eq("cust_acc_id", custAccId);
        wrapper.orderByDesc("gmt_update");
        if (StringUtils.isNotBlank(selectVo.getName())) {
            wrapper.like("name", selectVo.getName());
        }
        PageUtil.setPageLimit(selectVo);
        Page<ZjGoodsSpec> page = this.page(new Page<>(selectVo.getPage(), selectVo.getLimit()), wrapper);

        List<Long> specIdList = page.getRecords().stream().map(ZjGoodsSpec::getId).toList();
        List<ZjGoodsSpecContent> contentList = goodsSpecContentService.getBySpecIdList(specIdList);

        List<GoodsSpecListVo> voList = new ArrayList<>();
        page.getRecords().forEach(t -> {
            List<String> collect = contentList.stream().filter(ZjGoodsSpecContent -> ZjGoodsSpecContent.getSpecId().equals(t.getId())).map(ZjGoodsSpecContent::getVal).collect(Collectors.toList());
            voList.add(GoodsSpecListVo.beanToVo(t, String.join("、", collect)));
        });
        return PageUtil.pageList(page.getCurrent(), page.getSize(), page.getTotal(), voList);
    }

    @Override
    public GoodsSpecVo getInfo(Long id) {
        ZjGoodsSpec spec = this.getById(id);
        Assert.isTrue(null != spec, "["+ id +"]的数据不存在！", null);
        GoodsSpecVo vo = new GoodsSpecVo();
        BeanUtils.copyProperties(spec, vo);
        vo.setStatus(spec.getDisabled());

        List<ZjGoodsSpecContent> contentList = goodsSpecContentService.getBySpecId(id);
        List<GoodsSpecContentVo> contentVoList = new ArrayList<>();
        GoodsSpecContentVo contentVo = null;
        for (ZjGoodsSpecContent content : contentList) {
            contentVo = new GoodsSpecContentVo();
            BeanUtils.copyProperties(content, contentVo);
            contentVoList.add(contentVo);
            vo.setContentList(contentVoList);
        }
        return vo;
    }

    // 批量禁用或启用规格
    @Override
    public void updateBatchDisableByIds(List<Long> idList, boolean status) {
        goodsSpecMapper.updateBatchDisableByIds(idList, status);
    }

    // 批量删除规格
    @Override
    @Transactional
    public void deleteByIds(List<Long> idList) {
        goodsSpecContentService.deleteBySpecIds(idList);
        this.removeByIds(idList);
    }

    // 分页获取规格下拉数据列表
    @Override
    public Map<String, Object> pageSelect(Long custAccId, SelectVo selectVo) {
        QueryWrapper<ZjGoodsSpec> wrapper = new QueryWrapper<>();
        wrapper.select("id", "name");
        wrapper.eq("cust_acc_id", custAccId);
        wrapper.eq("is_disabled", false);
        if (StringUtils.isNotBlank(selectVo.getName())) {
            wrapper.like("name", selectVo.getName());
        }
        PageUtil.setSelectPageLimit(selectVo);
        Page<ZjGoodsSpec> page = this.page(new Page<>(selectVo.getPage(), selectVo.getLimit()), wrapper);

        List<Long> specIds = page.getRecords().stream().map(ZjGoodsSpec::getId).toList();
        List<ZjGoodsSpecContent> contentList = goodsSpecContentService.getBySpecIdList(specIds);

        List<SelectGoodsVo> voList = new ArrayList<>();
        page.getRecords().forEach(t -> voList.add(new SelectGoodsVo(t.getId(), t.getName(), contentList.stream().filter(ZjGoodsSpecContent -> ZjGoodsSpecContent.getSpecId().equals(t.getId())).map(ZjGoodsSpecContent::getVal).toList())));
        return PageUtil.pageList(page.getCurrent(), page.getPages(), page.getTotal(), voList);
    }
}
